//验证服务器的有效性
/*
1.微信服务器识别开发者服务器,
    微信测试号管理页面   
    -用测试号中填写的url开发者服务器地址进行测试
        -使用小米球ngork实现本地内网穿透：
        http://wuyu.ngrok2.xiaomiqiu.cn
        https://wuyu.ngrok2.xiaomiqiu.cn
    -填写token:
    wuyu(自定义)
2.开发者服务器 - 验证消息是否从微信服务器传来
    目的：用过计算得出signature微信加密签名和微信服务器发来的signature进行对比，判断是否一致，一致表示消息来自微信服务器，否则，表示不是来自微信服务器。
    实现步骤：
     1.将参与微信加密签名的三个参数（timestamp，noces,token）按照字典排序在一起形成一个数组；
     2.将形成的数组中的所有参数拼接在一起形成一个字符串，进行sha1加密；
     3.将加密完成的signature和微信发送过来的进行对比：
        一致，表示消息来自微信服务器，
        否则，表示不是来自微信服务器
*/
// 引入sha1模块
const sha1 = require('sha1')
// 引入配置对象
const config = require('../config/index.js');
//引入工具函数包
const {
	getUserDataAsync,
	parseXMLAsync,
	formatMessage
} = require('../util/tool.js');
//引入template模块
const template = require('./template.js')
//引入reply模块
const reply = require('./reply.js')
module.exports = () => {
		return async (req, res, next) => {
			// 微信服务器发来的参数
			// console.log(req.query)
			/*{
			    signature: '6cd0859504c3dcbab6bc5752e8b45cc3a137533b', // 微信的加密签名
			    echostr: '7523796442737996953', // 微信发的随机字符串
			    timestamp: '1623117841', // 微信发的时间戳
			    nonce: '2076503949' // 微信发送的随机数字
			}
			*/
			// 对象的结构赋值
			const {
				signature,
				echostr,
				timestamp,
				nonce
			} = req.query;
			const {
				token
			} = config;
			//1.将参与微信加密签名的三个参数（timestamp，noces,token）按照字典排序在一起形成一个数组,2.数组中的所有参数拼接在一起形成一个字符串，进行sha1加密；
			const sha1str = sha1([timestamp, nonce, token].sort().join(''))

			// console.log(sha1str)

			/*
			微信服务器会发送两种类型的消息给开发者服务器
			1.GET请求 
			目的：即上面所说的验证服务器有效性
			2.POST请求
			目的：微信服务器将用户发送的信息以PSOST请求方式转发到开发者服务器
			 */
			if (req.method === 'GET') {
				//3.将加密完成的signature和微信发送过来的进行对比：
				if (sha1str === signature) {
					//如果一样，说明消息来自微信服务器，返回echostr给微信服务器
					res.send(echostr);
				} else {
					//如果不一样，说明不是微信服务器发来的消息，返回err
					res.end('靓仔，你在白嫖')
				}
			} else if (req.method === 'POST') {
				//验证消息来自微信服务器
				if (sha1str !== signature) {
					//说明不是微信服务器
					res.end('靓仔，你在白嫖')
				}
				// console.log(req.query)
				/*
				{
				    signature: 'fc641f6c8c17d2efc1ada170fcc02432a473bdc0',
				    timestamp: '1623737431',
				    nonce: '2011629952',
				    openid: 'oBYoY65UYJ2uF6U-TTHf9q8YB0cQ' //用户的微信Id
				}     
				*/


				//接收请求体数据，流式数据----------------------------------------------------------------------------------------
				const xmlData = await getUserDataAsync(req)
				console.log("XML文件：")
				console.log(xmlData)
				/*
				<xml><ToUserName><![CDATA[gh_f8bb159c76fd]]></ToUserName>   //开发者id
				<FromUserName><![CDATA[oBYoY65UYJ2uF6U-TTHf9q8YB0cQ]]></FromUserName> //用户的openid
				<CreateTime>1623739161</CreateTime> //发送的时间戳
				<MsgType><![CDATA[text]]></MsgType> //发送的消息类型
				<Content><![CDATA[567]]></Content>  //发送的内容
				<MsgId>23246353262619943</MsgId>  //消息id 微信服务器会默认保存3天用户发送的数据，通过此id三天就能找到消息数据，三天后会被销毁
				</xml>
				*/

				//将拿到xml数据解析成js---------------------------------------------------------------------------------------------
				const jsData = await parseXMLAsync(xmlData)
				console.log("XML转化为js对象：")
				console.log(jsData)
				/*
				{
				    xml: {
				        ToUserName: [ 'gh_f8bb159c76fd' ],
				        FromUserName: [ 'oBYoY65UYJ2uF6U-TTHf9q8YB0cQ' ],
				        CreateTime: [ '1623741119' ],
				        MsgType: [ 'text' ],
				        Content: [ '123' ],
				        MsgId: [ '23246384667547647' ]
				    }
				}
				//地理位置信息
				// Event: [ 'LOCATION' ],
				// Latitude: [ '34.206703' ],
				// Longitude: [ '108.830498' ],
				// Precision: [ '15.000000' ]
				*/



				//格式化数据-----------------------------------------------------------------------------------------------------------
				const message = formatMessage(jsData)
				console.log("格式化js对象：")
				console.log(message)
				/*
				{
				  ToUserName: 'gh_f8bb159c76fd',
				  FromUserName: 'oBYoY65UYJ2uF6U-TTHf9q8YB0cQ',
				  CreateTime: '1623812287',
				  MsgType: 'text',
				  Content: '6789',
				  MsgId: '23247401350331247'
				}
				*/
				
				
				
				const options = reply(message)
				// console.log('-----------------')
				// console.log(options)
				
				//最终回复给用户的消息
				const replyMessage = template(options)

				// console.log(replyMessage)

				res.send(replyMessage)
				
					// /*
					// 如果开发者服务器没有返回相应给微信服务器，微信服务器会发送三次请求！
					// */
					// res.end('')
					
				} else {
					res.end('靓仔，你在白嫖')
				}


			}
		}
